package top.roadvast.rabbitmq.consumer;

import com.rabbitmq.client.*;
import org.springframework.boot.test.context.SpringBootTest;
import top.roadvast.rabbitmq.utils.RabbitmqUtil;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * @Author 郭泽鹏
 * @Date 2021/12/26 11:01
 * @Version 1.0
 * @Description 工作模式：消费者一号
 */
@SpringBootTest
public class WorkConsumer01 {
    public static void main(String[] args) throws IOException {
        Connection connection = RabbitmqUtil.getConnection();
        Channel channel = connection.createChannel();
        //参数：队列，是否持久化，是否排他，是否自动删除队列，其他
//        channel.queueDeclare("workqueue", false, false, false, null);
        //队列持久化
        channel.queueDeclare("task_queue", true, false, false, null);
        System.out.println("等待接收数据...");
        channel.basicQos(1);        //合理分发：一次只接收一条消息
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
            System.out.println("开始接收消息...");
            for (int i = 0; i < msg.length(); i++) {
                if ('.' == msg.charAt(i)) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            System.out.println("接收到消息：" + msg);

            //发送回执
            channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
        };
        CancelCallback cancelCallback = (consumerTag) -> {

        };

        /*
         * 启动一个消费者，并返回服务端生成的消费者标识
         * queue:队列名
         * autoAck：true 接收到传递过来的消息后acknowledged（应答服务器），false 接收到消息后不应答服务器
         * deliverCallback： 当一个消息发送过来后的回调接口
         * cancelCallback：当一个消费者取消订阅时的回调接口;取消消费者订阅队列时除了使用{@link Channel#basicCancel}之外的所有方式都会调用该回调方法
         * @return 服务端生成的消费者标识
         */
//        channel.basicConsume("workqueue", true, deliverCallback, cancelCallback);
        //autoAck设置为false,则需要手动确认发送回执
        channel.basicConsume("workqueue", false, deliverCallback, cancelCallback);
    }
}
